﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Pandemia.Funcionalidad;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Pandemia.Entidades;

namespace Pandemia.Servicios
{
    [ServiceContract()]
    public class SoporteService: BaseService
    {
        #region Admin

        [OperationContract(IsOneWay=true)]
        public void Saludar()
        {

        }

        [OperationContract()]
        public List<Nodo> TraerNodos(string token, out string error)
        {
            List<Nodo> nodos = new List<Nodo>();

            try
            {
                ChequeoBasico(token);
                nodos = Servidor.ObtenerNodos();
                error = string.Empty;
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }

            return nodos;
        }

        [OperationContract()]
        public string ObtenerClavePublica()
        {
            return Servidor.ObtenerClavePublica();
        }

        [OperationContract()]
        public ResultadoComando ObtenerResultado(int idComando, string token, out string error)
        {
            ResultadoComando resultado = new ResultadoComando();

            try
            {
                ChequeoBasico(token);
                resultado = Servidor.ObtenerResultado(idComando);
                error = string.Empty;
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }

            return resultado;
        }

        [OperationContract()]
        public int SolicitarAccion(Nodo nodo, string path, string token, TipoComando tipo, out string error)
        {
            int idComando = -1;

            try
            {
                ChequeoBasico(token);
                idComando = Servidor.SolicitarAccion(nodo, path, tipo).IdComando;
                error = string.Empty;
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }

            return idComando;
        }

        [OperationContract()]
        public bool NodoEstaOnline(Nodo nodo, string token, out string error)
        {
            Nodo nodeitor = null;

            try
            {
                ChequeoBasico(token);
                nodeitor = Servidor.TraerNodo(nodo.Alias, nodo.NombreMaquina, nodo.Ip, nodo.ID);
                error = null;
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }

            return nodeitor != null;
        }

        #endregion

        #region Conexion

        [OperationContract()]
        public Comando ObtenerComando(string alias, string nombreMaquina, int ID)
        {
            Nodo nodo = Servidor.RegistrarPing(alias, nombreMaquina, ObtenerIp(), ID);
            Comando comando = Servidor.ObtenerComando(nodo);
            comando.Estado = EstadoComando.Obtenido;

            return comando;
        }

        [OperationContract(IsOneWay = true)]
        public void EnviarResultado(ResultadoComando resultado)
        {
            Servidor.CargarResultado(resultado);
        }

        #endregion
    }
}
